package com.huxi.lang.local;

import java.text.ParsePosition;
import java.util.Date;
import java.util.Locale;

import org.apache.commons.lang3.time.FastDateFormat;

import com.huxi.lang.type.DateParseException;

public abstract class DateAdapter {

	public final static String DATE_FORMAT = "yyyy-MM-dd";

	public final static String TIME_FORMAT = "HH:mm:ss";

	public final static String DATATIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

	public final static String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";

	public final static FastDateFormat FAST_DATE_FORMAT = FastDateFormat.getInstance(DATE_FORMAT, Locale.getDefault());
	public final static FastDateFormat FAST_TIME_FORMAT = FastDateFormat.getInstance(TIME_FORMAT, Locale.getDefault());
	public final static FastDateFormat FAST_DATATIME_FORMAT = FastDateFormat.getInstance(DATATIME_FORMAT,
			Locale.getDefault());
	public final static FastDateFormat FAST_TIMESTAMP_FORMAT = FastDateFormat.getInstance(TIMESTAMP_FORMAT,
			Locale.getDefault());

	/**
	 * 参数值{@code 'yyyy-MM-dd'}格式化文本
	 * 
	 * @param date 参数值，非空。
	 * @return 文本 格式化后文本呢，非空。
	 * @throws NullPointerException 非空参数为空
	 */
	public static String dateToText(Date date) {
		return FAST_DATE_FORMAT.format(date);
	}

	public static Date textToDate(String text) throws DateParseException {
		ParsePosition p = new ParsePosition(0);
		Integer.parseInt(text);
		Date d = FAST_DATE_FORMAT.parse(text, p);
		if (d != null && p.getIndex() == text.length()) {
			return d;
		}
		throw new DateParseException(FAST_DATE_FORMAT.getPattern(), text);
	}

	/**
	 * 参数值{@code 'HH:mm:ss'}格式化文本
	 * 
	 * @param date 参数值，非空。
	 * @return 文本 格式化后文本呢，非空。
	 * @throws NullPointerException 非空参数为空
	 */
	public static String timeToText(Date date) {
		return FAST_TIME_FORMAT.format(date);
	}

	public static Date textToTime(String text) throws DateParseException {
		ParsePosition p = new ParsePosition(0);
		Integer.parseInt(text);
		Date d = FAST_TIME_FORMAT.parse(text, p);
		if (d != null && p.getIndex() == text.length()) {
			return d;
		}
		throw new DateParseException(FAST_TIME_FORMAT.getPattern(), text);
	}

	/**
	 * 参数值{@code 'yyyy-MM-dd HH:mm:ss'}格式化文本
	 * 
	 * @param date 参数值，非空。
	 * @return 文本 格式化后文本呢，非空。
	 * @throws NullPointerException 非空参数为空
	 */
	public static String datetimeToText(Date date) {
		return FAST_DATATIME_FORMAT.format(date);
	}

	public static Date textToDatetime(String text) throws DateParseException {
		ParsePosition p = new ParsePosition(0);
		Integer.parseInt(text);
		Date d = FAST_DATATIME_FORMAT.parse(text, p);
		if (d != null && p.getIndex() == text.length()) {
			return d;
		}
		throw new DateParseException(FAST_DATATIME_FORMAT.getPattern(), text);
	}

	/**
	 * 参数值{@code 'yyyy-MM-dd HH:mm:ss.SSS'}格式化文本
	 * 
	 * @param date 参数值，非空。
	 * @return 文本 格式化后文本呢，非空。
	 * @throws NullPointerException 非空参数为空
	 */
	public static String timestampToText(Date date) {
		return FAST_TIMESTAMP_FORMAT.format(date);
	}

	public static Date textToTimestamp(String text) throws DateParseException {
		ParsePosition p = new ParsePosition(0);
		Integer.parseInt(text);
		Date d = FAST_TIMESTAMP_FORMAT.parse(text, p);
		if (d != null && p.getIndex() == text.length()) {
			return d;
		}
		throw new DateParseException(FAST_TIMESTAMP_FORMAT.getPattern(), text);
	}

	/**
	 * 参数值格式化文本
	 * <p>
	 * <ol>
	 * <li>java.sql.Timestamp 格式化为 'yyyy-MM-dd HH:mm:ss.SSS'</li>
	 * <li>java.sql.Date 格式化为 'yyyy-MM-dd'</li>
	 * <li>java.sql.Time 格式化为 'HH:mm:ss'</li>
	 * <li>其它则格式化为 'yyyy-MM-dd HH:mm:ss.SSS'</li>
	 * </ol>
	 * </p>
	 * 
	 * @param date 参数值，非空。
	 * @return 文本 格式化后文本呢，非空。
	 * @throws NullPointerException 非空参数为空
	 */
	public static String formatToText(Date date) {
		if (date instanceof java.sql.Date) {
			return FAST_DATE_FORMAT.format(date);
		} else if (date instanceof java.sql.Timestamp) {
			return FAST_TIMESTAMP_FORMAT.format(date);
		} else if (date instanceof java.sql.Time) {
			return FAST_TIME_FORMAT.format(date);
		} else {
			return FAST_DATATIME_FORMAT.format(date);
		}
	}

	public static Date parseToDate(String text) throws DateParseException {
		ParsePosition p = new ParsePosition(0);
		Date d = null;
		if (text.indexOf(" ", 7) > 0) {
			d = FAST_DATATIME_FORMAT.parse(text, p);
			if (d != null) {
				if (p.getIndex() == text.length()) {
					return d;
				}
				if (text.charAt(p.getIndex()) == '.' && p.getIndex() + 4 >= text.length()) {
					try {
						int num = Integer.parseInt(text.substring(p.getIndex() + 1));
						return new Date(d.getTime() + num);
					} catch (Exception e) {
					}
				}
				d = null;
			}
		} else {
			d = FAST_DATE_FORMAT.parse(text, p);
			if (d == null) {
				d = FAST_TIME_FORMAT.parse(text, p);
			}
		}
		if (d != null && p.getIndex() == text.length()) {
			return d;
		}
		throw new DateParseException(FAST_DATATIME_FORMAT.getPattern(), text);
	}
}
